package com.bauer.java.doc.pdf.text.util;

import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.canvas.parser.EventType;
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
import com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo;
import com.itextpdf.kernel.pdf.canvas.parser.filter.IEventFilter;

import java.util.List;

/**
 * @Author ：rui.wei
 * @Date ：Created in 9:53 2019/4/9
 * @Description：
 */
public class KeyWordIEventFilter implements IEventFilter {

    private List<PdfPositon> pdfPositons;

    private int[] keywordCursors;

    private int pageNo = 1;

    public KeyWordIEventFilter(List<PdfPositon> pdfPositons) {
        this.pdfPositons = pdfPositons;
        this.keywordCursors = new int[pdfPositons.size()];
    }

    @Override
    public boolean accept(IEventData data, EventType type) {

        if (type.equals(EventType.RENDER_TEXT) && pdfPositons != null && pdfPositons.size() > 0) {
            TextRenderInfo renderInfo = (TextRenderInfo) data;

            dealWithKeyWord(renderInfo, pdfPositons);
        }
        return true;
    }

    private void dealWithKeyWord(TextRenderInfo renderInfo, List<PdfPositon> pdfPositons) {

        char charWord = renderInfo.getText().charAt(0);

        for (int i = 0; i < pdfPositons.size(); i++) {
            PdfPositon pdfPositon = pdfPositons.get(i);
            int keywordCursor = keywordCursors[i];

            char[] keyWords = pdfPositon.getKeyWord().toCharArray();

            if (keywordCursor == keyWords.length) {
                Rectangle rectangle = renderInfo.getBaseline().getBoundingRectangle();
                pdfPositon.setPageNo(pageNo);
                pdfPositon.setPosX(rectangle.getX());
                pdfPositon.setPosY(rectangle.getY());
                keywordCursors[i] = 0;
                continue;
            }

            if (charWord == keyWords[keywordCursor]) {
                keywordCursors[i] = ++keywordCursor;
            } else {
                keywordCursors[i] = 0;
            }

        }

    }

    public List<PdfPositon> getPdfPositons() {
        return pdfPositons;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }
}
